home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / dir / RCS / scandir.c,v < prev    next >
Text File  |  1988-09-28  |  3KB  |  132 lines

  1. head     1.2;
  2. access   ;
  3. symbols  ;
  4. locks    ; strict;
  5. comment  @ * @;
  6.  
  7.  
  8. 1.2
  9. date     88.09.28.11.19.19;  author mlgray;  state Exp;
  10. branches ;
  11. next     1.1;
  12.  
  13. 1.1
  14. date     88.09.28.11.18.34;  author mlgray;  state Exp;
  15. branches ;
  16. next     ;
  17.  
  18.  
  19. desc
  20. @first checkin
  21. @
  22.  
  23.  
  24. 1.2
  25. log
  26. @Fixed incorrect parameter declaration.
  27. @
  28. text
  29. @/*
  30.  * Copyright (c) 1983 Regents of the University of California.
  31.  * All rights reserved.  The Berkeley software License Agreement
  32.  * specifies the terms and conditions for redistribution.
  33.  */
  34.  
  35. #if defined(LIBC_SCCS) && !defined(lint)
  36. static char sccsid[] = "@@(#)scandir.c    5.2 (Berkeley) 3/9/86";
  37. #endif LIBC_SCCS and not lint
  38.  
  39. /*
  40.  * Scan the directory dirname calling select to make a list of selected
  41.  * directory entries then sort using qsort and compare routine dcomp.
  42.  * Returns the number of entries and a pointer to a list of pointers to
  43.  * struct direct (through namelist). Returns -1 if there were any errors.
  44.  */
  45.  
  46. #include <sys/types.h>
  47. #include <sys/stat.h>
  48. #include <sys/dir.h>
  49.  
  50. scandir(dirname, namelist, select, dcomp)
  51.     char *dirname;
  52.     struct direct ***namelist;
  53.     int (*select)(), (*dcomp)();
  54. {
  55.     register struct direct *d, *p, **names;
  56.     register int nitems;
  57.     register char *cp1, *cp2;
  58.     struct stat stb;
  59.     long arraysz;
  60.     DIR *dirp;
  61.  
  62.     if ((dirp = opendir(dirname)) == NULL)
  63.         return(-1);
  64.     if (fstat(dirp->dd_fd, &stb) < 0)
  65.         return(-1);
  66.  
  67.     /*
  68.      * estimate the array size by taking the size of the directory file
  69.      * and dividing it by a multiple of the minimum size entry. 
  70.      */
  71.     arraysz = (stb.st_size / 24);
  72.     names = (struct direct **)malloc(arraysz * sizeof(struct direct *));
  73.     if (names == NULL)
  74.         return(-1);
  75.  
  76.     nitems = 0;
  77.     while ((d = readdir(dirp)) != NULL) {
  78.         if (select != NULL && !(*select)(d))
  79.             continue;    /* just selected names */
  80.         /*
  81.          * Make a minimum size copy of the data
  82.          */
  83.         p = (struct direct *)malloc(DIRSIZ(d));
  84.         if (p == NULL)
  85.             return(-1);
  86.         p->d_ino = d->d_ino;
  87.         p->d_reclen = d->d_reclen;
  88.         p->d_namlen = d->d_namlen;
  89.         for (cp1 = p->d_name, cp2 = d->d_name; *cp1++ = *cp2++; );
  90.         /*
  91.          * Check to make sure the array has space left and
  92.          * realloc the maximum size.
  93.          */
  94.         if (++nitems >= arraysz) {
  95.             if (fstat(dirp->dd_fd, &stb) < 0)
  96.                 return(-1);    /* just might have grown */
  97.             arraysz = stb.st_size / 12;
  98.             names = (struct direct **)realloc((char *)names,
  99.                 arraysz * sizeof(struct direct *));
  100.             if (names == NULL)
  101.                 return(-1);
  102.         }
  103.         names[nitems-1] = p;
  104.     }
  105.     closedir(dirp);
  106.     if (nitems && dcomp != NULL)
  107.         qsort(names, nitems, sizeof(struct direct *), dcomp);
  108.     *namelist = names;
  109.     return(nitems);
  110. }
  111.  
  112. /*
  113.  * Alphabetic order comparison routine for those who want it.
  114.  */
  115. alphasort(d1, d2)
  116.     struct direct **d1, **d2;
  117. {
  118.     return(strcmp((*d1)->d_name, (*d2)->d_name));
  119. }
  120. @
  121.  
  122.  
  123. 1.1
  124. log
  125. @Initial revision
  126. @
  127. text
  128. @d24 1
  129. a24 1
  130.     struct direct *(*namelist[]);
  131. @
  132.